home *** CD-ROM | disk | FTP | other *** search
/ Aminet 15 / Aminet 15 - Nov 1996.iso / Aminet / dev / c / EasygadgetsSou.lha / EasyGadgets / Menu.c < prev    next >
C/C++ Source or Header  |  1995-11-09  |  5KB  |  210 lines

  1. /*
  2.  *    File:                    Menu.c
  3.  *    Description:    A set of functions to manipulate menus.
  4.  *
  5.  *    (C) 1994,1995 Ketil Hunn
  6.  *
  7.  */
  8.  
  9. #ifndef    MENUFUNCTIONS_C
  10. #define    MENUFUNCTIONS_C
  11.  
  12. /*** DEFINES *************************************************************************/
  13. #define every_node    node=list->lh_Head;node->ln_Succ;node=node->ln_Succ
  14.  
  15. /*** FUNCTIONS ***********************************************************************/
  16. __asm __saveds struct MenuItem *egFindMenuItem(    register __a0 struct Menu *mymenu,
  17.                                                                                                 register __d0 ULONG idcmp)
  18. {
  19.     register struct Menu            *menu;
  20.     register struct MenuItem    *item, *sub;
  21.  
  22. #ifdef MYDEBUG_H
  23.     DebugOut("egFindMenuItem");
  24. #endif
  25.  
  26.     for(menu=mymenu; menu!=NULL; menu=menu->NextMenu)
  27.         for(item=menu->FirstItem; item!=NULL; item=item->NextItem)
  28.         {
  29.             for(sub=item->SubItem; sub!=NULL; sub=sub->NextItem)
  30.                 if(GTMENUITEM_USERDATA(sub)==(APTR)idcmp)
  31.                     return sub;
  32.             if(GTMENUITEM_USERDATA(item)==(APTR)idcmp)
  33.                 return item;
  34.         }
  35.     return NULL;
  36. }
  37.  
  38. __asm __saveds BYTE egIsMenuItemChecked(register __a0 struct Menu *menu,
  39.                                                                                 register __d0 ULONG idcmp)
  40. {
  41.     register struct MenuItem    *item=egFindMenuItem(menu, idcmp);
  42.  
  43. #ifdef MYDEBUG_H
  44.     DebugOut("egIsMenu_ItemChecked");
  45. #endif
  46.  
  47.     if(item)
  48.         if(ISBITSET(item->Flags, CHECKED))
  49.             return TRUE;
  50.     return FALSE;
  51. }
  52.  
  53. __asm __saveds void egSetMenuBitA(register __a0 struct Window    *window,
  54.                                                                     register __a1 struct Menu        *menu,
  55.                                                                     register __d0 ULONG                    bit,
  56.                                                                     register __d1 ULONG                    *array)
  57. {
  58. #ifdef MYDEBUG_H
  59.     DebugOut("egSetMenuBitA");
  60. #endif
  61.  
  62.  
  63.     if(menu)
  64.     {
  65.         register struct MenuItem    *item;
  66.         register int    i=0;
  67.  
  68.         if(window)
  69.             ClearMenuStrip(window);
  70.  
  71.         while(array[i])
  72.             if(item=egFindMenuItem(menu, array[i++]))
  73.                 IFTRUESETBIT(array[i++], item->Flags, bit);
  74.  
  75.         if(window)
  76.             ResetMenuStrip(window, menu);
  77.     }
  78. }
  79. /*
  80. __asm __saveds void egSetMenuItem(register __a0 struct NewMenu    *menuitem,
  81.                                                                     register __d0 UBYTE                        type,
  82.                                                                     register __a1 STRPTR                    label,
  83.                                                                     register __d1 UWORD                        flags,
  84.                                                                     register __d2 LONG                        exclude,
  85.                                                                     register __a2 APTR                        userdata)
  86. {
  87.     if(label==NM_BARLABEL)
  88.     {
  89.         menuitem->nm_Label    =label;
  90.         menuitem->nm_CommKey=NULL;
  91.     }
  92.     else if(*label!=' ' && *(label+1)=='\0')
  93.     {
  94.         menuitem->nm_Label    =label+2;
  95.         menuitem->nm_CommKey=label;
  96.     }
  97.     else
  98.     {
  99.         menuitem->nm_Label    =label;
  100.         menuitem->nm_CommKey=NULL;
  101.     }
  102.     menuitem->nm_Type                    =type;
  103.     menuitem->nm_Flags                =flags;
  104.     menuitem->nm_MutualExclude=exclude;
  105.     menuitem->nm_UserData            =userdata;
  106. }                    
  107. */
  108.  
  109. #define    EG_MENUBORDER    20
  110.  
  111. __asm __saveds void egMakeHelpMenu(    register __a0 struct Menu        *menu,
  112.                                                                         register __a1 struct Screen    *screen)
  113. {
  114.     if(menu)
  115.     {
  116.         register struct Menu *m=menu;
  117.         register struct MenuItem *item;
  118.         register UWORD itemwidth=0;
  119.  
  120.         while(m->NextMenu)
  121.             m=m->NextMenu;
  122.  
  123.         m->LeftEdge=screen->Width-TextLength(&(screen->RastPort), m->MenuName, StrLen(m->MenuName))-EG_MENUBORDER;
  124.  
  125.         for(item=m->FirstItem; item; item=item->NextItem)
  126.             itemwidth=MAX(itemwidth, item->Width);
  127.  
  128.         for(item=m->FirstItem; item; item=item->NextItem)
  129.             item->LeftEdge-=itemwidth-m->Width;
  130.     }
  131. }
  132.  
  133. __asm __saveds struct Menu *egCreateMenuA(register __a0 int *menudata)
  134. {
  135.     register struct Menu        *menu=NULL;
  136.     register ULONG                    i=0L, num, count=0L;
  137.  
  138.     while(menudata[i]!=NM_END)
  139.     {
  140.         if(menudata[i]==EG_LIST | menudata[i]==EG_SUBLIST)
  141.             count+=egCountList((struct List *)menudata[i+1]);
  142.         i+=5;
  143.     }
  144.  
  145.     if(num=i/5+count)
  146.     {
  147.         register struct NewMenu *newmenu;
  148.  
  149.         if(newmenu=(struct NewMenu *)AllocVec(sizeof(struct NewMenu)*(num+1), MEMF_CLEAR))
  150.         {
  151.             register ULONG item=0L;
  152.  
  153.             i=0L;
  154.             while(menudata[i]!=NM_END)
  155.             {
  156.                 if(menudata[i]==NM_IGNORE)
  157.                     i+=4;
  158.                 else if(menudata[i]==EG_LIST | menudata[i]==EG_SUBLIST)
  159.                 {
  160.                     register struct Node    *node;
  161.                     UBYTE                                    type        =(menudata[i]==EG_LIST ? NM_ITEM:NM_SUB);
  162.                     register struct List    *list        =(struct List *)menudata[++i];
  163.                     UWORD                                 flags        =(UWORD)menudata[++i];
  164.                     LONG                                    mx            =(LONG)menudata[++i];
  165.                     register ULONG                base        =(ULONG)menudata[++i];
  166.  
  167.                     if(list)
  168.                         for(every_node)
  169.                         {
  170.                             newmenu[item].nm_Type                    =type;
  171.                             newmenu[item].nm_Label                =node->ln_Name;
  172.                             newmenu[item].nm_Flags                =flags;
  173.                             newmenu[item].nm_MutualExclude=mx;
  174.                             newmenu[item].nm_UserData            =(APTR)(base++);
  175.                             ++item;
  176.                         }
  177.                 }
  178.                 else
  179.                 {
  180.                     register STRPTR label;
  181.  
  182.                     newmenu[item].nm_Type    =(UBYTE)menudata[i++];
  183.  
  184.                     label=(STRPTR)menudata[i];
  185.  
  186.                     if(menudata[i]!=(int)NM_BARLABEL && *(label+1)=='\0')
  187.                     {
  188.                         newmenu[item].nm_Label        =(STRPTR)label+2;
  189.                         newmenu[item].nm_CommKey    =(STRPTR)label;
  190.                     }
  191.                     else
  192.                     {
  193.                         newmenu[item].nm_Label        =(STRPTR)label;
  194.                         newmenu[item].nm_CommKey    =(STRPTR)NULL;
  195.                     }
  196.                     newmenu[item].nm_Flags                =(UWORD)menudata[++i];
  197.                     newmenu[item].nm_MutualExclude=(LONG)menudata[++i];
  198.                     newmenu[item].nm_UserData            =(APTR)menudata[++i];
  199.                     ++item;
  200.                 }
  201.                 ++i;
  202.             }
  203.             menu=CreateMenus(newmenu, TAG_END);
  204.             FreeVec(newmenu);
  205.         }
  206.     }
  207.     return menu;
  208. }
  209. #endif
  210.